package com.ccloud.api.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ccloud.api.system.domain.SysUser;
import com.ccloud.api.system.model.LoginUser;
import com.ccloud.api.system.model.SysLoginModel;
import com.ccloud.common.core.reqres.response.Result;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author chentailai
 */
public interface ISysUserService extends IService<SysUser> {

    /**
     * 用户登录逻辑
     *
     * @param sysLoginModel 登录入参对象
     * @return {@link Result<?>}
     * @author chentl
     * @version v1.0.0
     * @since 1:46 下午 2022/3/24
     **/
    Result<Map<String, Object>> login(SysLoginModel sysLoginModel);

    /**
     * 手机号登录
     *
     * @param phoneLoginParam 电话登录入参
     * @return {@link Result<?>}
     * @author chentl
     * @version v1.0.0
     * @since 1:51 下午 2022/3/24
     **/
    Result<Map<String, Object>> phoneLogin(Map<String, String> phoneLoginParam);

    /**
     * 短信登录
     *
     * @param smsParam 短信登录入参
     * @return {@link Result< Map< String, Object>>}
     * @author chentl
     * @version v1.0.0
     * @since 1:53 下午 2022/3/24
     **/
    Result<Map<String, Object>> smsLogin(Map<String, String> smsParam);

    /**
     * 重置密码
     *
     * @param username        用户名
     * @param oldpassword     旧密码
     * @param newpassword     新密码
     * @param confirmpassword 确认密码
     * @return
     */
    Result<?> resetPassword(String username, String oldpassword, String newpassword, String confirmpassword);

    /**
     * 修改密码
     *
     * @param sysUser
     * @return
     */
    Result<?> changePassword(SysUser sysUser);

    /**
     * 删除用户
     *
     * @param userId
     * @return
     */
    boolean deleteUser(String userId);

    /**
     * 批量删除用户
     *
     * @param userIds
     * @return
     */
    boolean deleteBatchUsers(String userIds);

    /**
     * 用户名获取
     *
     * @param username
     * @return
     */
    SysUser getUserByName(String username);

    /**
     * 用户名获取登录用户
     *
     * @param username
     * @return
     */
    LoginUser getLoginUserByName(String username);

    /**
     * 添加用户和用户角色关系
     *
     * @param user
     */
    void addUserWithRole(SysUser user);


    /**
     * 修改用户和用户角色关系
     *
     * @param user
     */
    void editUserWithRole(SysUser user);

    /**
     * 获取用户的授权角色
     *
     * @param username
     * @return
     */
    List<String> getRole(String username);

    /**
     * 根据角色Id查询
     *
     * @param page
     * @param roleId
     * @param username
     * @return
     */
    IPage<SysUser> getUserByRoleId(Page<SysUser> page, String roleId, String username);

    /**
     * 通过用户名获取用户角色集合
     *
     * @param username 用户名
     * @return 角色集合
     */
    Set<String> getUserRolesSet(String username);

    /**
     * 通过用户名获取用户权限集合
     *
     * @param username 用户名
     * @return 权限集合
     */
    Set<String> getUserPermissionsSet(String username);

    /**
     * 根据手机号获取用户名和密码
     */
    SysUser getUserByPhone(String phone);


    /**
     * 根据邮箱获取用户
     */
    SysUser getUserByEmail(String email);

    /**
     * 校验用户是否有效
     *
     * @param sysUser
     * @return
     */
    Result<Map<String, Object>> checkUserIsEffective(SysUser sysUser);

    /**
     * 查询被逻辑删除的用户
     */
    List<SysUser> queryLogicDeleted();

    /**
     * 还原被逻辑删除的用户
     */
    boolean revertLogicDeleted(List<String> userIds, SysUser updateEntity);

    /**
     * 彻底删除被逻辑删除的用户
     */
    boolean removeLogicDeleted(List<String> userIds);

    /**
     * 保存第三方用户信息
     *
     * @param sysUser
     */
    void saveThirdUser(SysUser sysUser);

}
